package com.snow.vpnclient.api;

import com.snow.vpnclient.common.ResponseModel;
import com.snow.vpnclient.dto.AncillaryProbateDto;
import com.snow.vpnclient.dto.AuthLoginDto;
import com.snow.vpnclient.dto.BindingStateDto;
import com.snow.vpnclient.dto.LocationDto;
import com.snow.vpnclient.dto.LoginConfigDto;
import com.snow.vpnclient.dto.LoginDto;
import com.snow.vpnclient.dto.LoginKeyDto;
import com.snow.vpnclient.dto.PackageInfoDto;
import com.snow.vpnclient.dto.SessionSettingsDto;
import com.snow.vpnclient.dto.TokenAuthDto;
import com.snow.vpnclient.dto.TokenSecretDto;
import com.snow.vpnclient.dto.UserInfoDto;

import java.util.List;
import java.util.Map;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;


/**
 * @author liufq
 * @since 2022-11-03 15:08:01
 */
public interface UserService {

    /**
     * 登录方式获取接口
     */
    @GET("snow-api/admin/inner_app_config/info")
    Call<ResponseModel<List<LoginConfigDto>>> loginConfig();

    /**
     * 密码加密接口
     */
    @POST("snow-api/oauthext/get_key")
    Call<ResponseModel<LoginKeyDto>> getKey();

    /**
     * 登录
     */
    @POST("snow-api/oauth/token")
    Call<ResponseModel<LoginDto>> login(@Header("content-type") String token, @QueryMap Map<String, Object> request);

    /**
     * 钉钉认证信息获取
     */
    @GET("snow-api/oauthext/get_dd_info")
    Call<ResponseModel<AuthLoginDto>> dingtalk();

    /**
     * 飞书认证信息获取
     */
    @GET("snow-api/oauthext/get_fs_info")
    Call<ResponseModel<AuthLoginDto>> feishu();

    /**
     * 企业微信认证信息获取
     */
    @GET("snow-api/oauthext/get_wecom_info")
    Call<ResponseModel<AuthLoginDto>> enterpriseWechat();

    /**
     * 企业微信认证信息获取
     */
    @GET("snow-api/oauthext/get_cas_info")
    Call<ResponseModel<AuthLoginDto>> cas(@Query("id") String id);

    /**
     * 刷新token
     */
    @POST("snow-api/oauth/token/refresh")
    Call<ResponseModel<LoginDto>> refresh(@Query("refresh_token") String refreshToken);

    /**
     * 获取用户信息
     */
    @GET("snow-api/staff/me/info")
    Call<ResponseModel<UserInfoDto>> getUserInfo(@Header("Authorization") String token);

    /**
     * 获取升级包信息
     */
    @GET("snow-api/l4/client/client_download_version?os_name=android&type=mobile")
    Call<ResponseModel<PackageInfoDto>> pkgInfo(@Header("Authorization") String token);

    /**
     * 登录方式获取接口
     */
    @Headers({"domain:http://myip.ipip.net"})
    @GET("/")
    Call<ResponseBody> myip();

    /**
     * 获取会话设置信息
     */
    @GET("snow-api/admin/sys_config/settings/session")
    Call<ResponseModel<SessionSettingsDto>> sessionSettings();

    /**
     * 获取用户登录位置信息
     */
    @GET("snow-api/extend/get_user_location")
    Call<ResponseModel<LocationDto>> location(@Header("Authorization") String token);

    /**
     * 查询绑定状态
     */
    @GET("snow-api/mfa/auth/otp/binding/state")
    Call<ResponseModel<BindingStateDto>> bindingState(@Header("Authorization") String token);

    /**
     * 校验code
     */
    @POST("snow-api/mfa/auth/verify/email")
    Call<ResponseModel<BindingStateDto>> verifyEmail(@Header("ztna-mfa-code") String token, @Body RequestBody body);

    /**
     * 校验code
     */
    @POST("snow-api/mfa/auth/verify/sms")
    Call<ResponseModel<BindingStateDto>> verifySms(@Header("ztna-mfa-code") String token, @Body RequestBody body);

    /**
     * 查询绑定状态
     */
    @GET("snow-api/mfa/auth/methods?client_type=mobile")
    Call<ResponseModel<List<AncillaryProbateDto>>> ancillaryProbate(@Header("ztna-mfa-code") String token);

    /**
     * 查询绑定状态
     */
    @POST("snow-api/mfa/auth/email/code")
    Call<ResponseModel<TokenAuthDto>> emailAuth(@Header("ztna-mfa-code") String token);

    /**
     * 查询绑定状态
     */
    @POST("snow-api/mfa/auth/sms/code")
    Call<ResponseModel<TokenAuthDto>> smsAuth(@Header("ztna-mfa-code") String token);

    /**
     * 查询绑定状态
     */
    @GET("snow-api/mfa/auth/otp/secret")
    Call<ResponseModel<TokenSecretDto>> getSecret(@Header("Authorization") String token);
}
